/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
import org.apache.commons.io.testtools.FileBasedTestCase;
/**
* This is used to test LineIterator for correctness.
*
* @author Niall Pemberton
* @author Stephen Colebourne
* @version $Id: LineIteratorTestCase.java 437567 2006-08-28 06:39:07Z bayard $
*/
public class LineIteratorTestCase extends FileBasedTestCase {
public static void main(String[] args) {
TestRunner.run(suite());
}
public static Test suite() {
return new TestSuite(LineIteratorTestCase.class);
}
public LineIteratorTestCase(String name) throws IOException {
super(name);
}
/** @see junit.framework.TestCase#setUp() */
protected void setUp() throws Exception {
File dir = getTestDirectory();
if (dir.exists()) {
FileUtils.deleteDirectory(dir);
}
dir.mkdirs();
}
/** @see junit.framework.TestCase#tearDown() */
protected void tearDown() throws Exception {
FileUtils.deleteDirectory(getTestDirectory());
}
//-----------------------------------------------------------------------
/**
* Test constructor.
*/
public void testConstructor() throws Exception {
try {
new LineIterator((Reader) null);
fail();
} catch (IllegalArgumentException ex) {
// expected
}
}
/**
* Test a file with no lines.
*/
public void testZeroLines() throws Exception {
doTestFileWithSpecifiedLines(0);
}
/**
* Test a file with 1 line.
*/
public void testOneLines() throws Exception {
doTestFileWithSpecifiedLines(1);
}
/**
* Test a file with 2 lines.
*/
public void testTwoLines() throws Exception {
doTestFileWithSpecifiedLines(2);
}
/**
* Test a file with 3 lines.
*/
public void testThreeLines() throws Exception {
doTestFileWithSpecifiedLines(3);
}
/**
* Test a missing File.
*/
public void testMissingFile() throws Exception {
File testFile = new File(getTestDirectory(), "dummy-missing-file.txt");
LineIterator iterator = null;
try {
iterator = FileUtils.lineIterator(testFile, "UTF-8");
fail("Expected FileNotFoundException");
} catch(FileNotFoundException expected) {
// ignore, expected result
} finally {
LineIterator.closeQuietly(iterator);
}
}
/**
* Test a file with a Valid encoding.
*/
public void testValidEncoding() throws Exception {
String encoding = "UTF-8";
File testFile = new File(getTestDirectory(), "LineIterator-validEncoding.txt");
createFile(testFile, encoding, 3);
LineIterator iterator = FileUtils.lineIterator(testFile, encoding);
try {
int count = 0;
while (iterator.hasNext()) {
assertTrue(iterator.next() instanceof String);
count++;
}
assertEquals(3, count);
} finally {
LineIterator.closeQuietly(iterator);
}
}
/**
* Test a file with an Invalid encoding.
*/
public void testInvalidEncoding() throws Exception {
String encoding = "XXXXXXXX";
File testFile = new File(getTestDirectory(), "LineIterator-invalidEncoding.txt");
createFile(testFile, "UTF-8", 3);
LineIterator iterator = null;
try {
iterator = FileUtils.lineIterator(testFile, encoding);
fail("Expected UnsupportedEncodingException");
} catch(UnsupportedEncodingException expected) {
// ignore, expected result
} finally {
LineIterator.closeQuietly(iterator);
}
}
/**
* Test the iterator using only the next() method.
*/
public void testNextOnly() throws Exception {
String encoding = null;
File testFile = new File(getTestDirectory(), "LineIterator-nextOnly.txt");
List lines = createFile(testFile, encoding, 3);
LineIterator iterator = FileUtils.lineIterator(testFile, encoding);
try {
for (int i = 0; i < lines.size(); i++) {
String line = (String)iterator.next();
assertEquals("next() line " + i, lines.get(i), line);
}
assertEquals("No more expected", false, iterator.hasNext());
} finally {
LineIterator.closeQuietly(iterator);
}
}
/**
* Test the iterator using only the nextLine() method.
*/
public void testNextLineOnly() throws Exception {
String encoding = null;
File testFile = new File(getTestDirectory(), "LineIterator-nextOnly.txt");
List lines = createFile(testFile, encoding, 3);
LineIterator iterator = FileUtils.lineIterator(testFile, encoding);
try {
for (int i = 0; i < lines.size(); i++) {
String line = iterator.nextLine();
assertEquals("nextLine() line " + i, lines.get(i), line);
}
assertFalse("No more expected", iterator.hasNext());
} finally {
LineIterator.closeQuietly(iterator);
}
}
/**
* Test closing the iterator before all the file has been
* processed.
*/
public void testCloseEarly() throws Exception {
String encoding = "UTF-8";
File testFile = new File(getTestDirectory(), "LineIterator-closeEarly.txt");
createFile(testFile, encoding, 3);
LineIterator iterator = FileUtils.lineIterator(testFile, encoding);
try {
// get
assertTrue("Line expected", iterator.next() instanceof String);
assertTrue("More expected", iterator.hasNext());
// close
iterator.close();
assertFalse("No more expected", iterator.hasNext());
try {
iterator.next();
fail();
} catch (NoSuchElementException ex) {
// expected
}
try {
iterator.nextLine();
fail();
} catch (NoSuchElementException ex) {
// expected
}
// try closing again
iterator.close();
try {
iterator.next();
fail();
} catch (NoSuchElementException ex) {
// expected
}
try {
iterator.nextLine();
fail();
} catch (NoSuchElementException ex) {
// expected
}
} finally {
LineIterator.closeQuietly(iterator);
}
}
/**
* Utility method to create and test a file with a specified
* number of lines.
*/
private void doTestFileWithSpecifiedLines(int lineCount) throws Exception {
String encoding = "UTF-8";
String fileName = "LineIterator-" + lineCount + "-test.txt";
File testFile = new File(getTestDirectory(), fileName);
List lines = createFile(testFile, encoding, lineCount);
LineIterator iterator = FileUtils.lineIterator(testFile, encoding);
try {
try {
iterator.remove();
fail("Remove is unsupported");
} catch (UnsupportedOperationException ex) {
// expected
}
int idx = 0;
while (iterator.hasNext()) {
String line = (String)iterator.next();
assertEquals("Comparing line " + idx, lines.get(idx), line);
assertTrue("Exceeded expected idx=" + idx + " size=" + lines.size(), idx < lines.size());
idx++;
}
assertEquals("Line Count doesn't match", idx, lines.size());
// try calling next() after file processed
try {
iterator.next();
fail("Expected NoSuchElementException");
} catch (NoSuchElementException expected) {
// ignore, expected result
}
try {
iterator.nextLine();
fail("Expected NoSuchElementException");
} catch (NoSuchElementException expected) {
// ignore, expected result
}
} finally {
LineIterator.closeQuietly(iterator);
}
}
/**
* Utility method to create a test file with a specified
* number of lines.
*/
private List createFile(File file, String encoding, int lineCount) throws Exception {
List lines = new ArrayList();
for (int i = 0; i < lineCount; i++) {
lines.add("LINE " + i);
}
FileUtils.writeLines(file, encoding, lines);
return lines;
}
//-----------------------------------------------------------------------
public void testFiltering() throws Exception {
String encoding = "UTF-8";
String fileName = "LineIterator-Filter-test.txt";
File testFile = new File(getTestDirectory(), fileName);
List lines = createFile(testFile, encoding, 9);
Reader reader = new FileReader(testFile);
LineIterator iterator = new LineIterator(reader) {
protected boolean isValidLine(String line) {
char c = line.charAt(line.length() - 1);
return ((c - 48) % 3 != 1);
}
};
try {
try {
iterator.remove();
fail("Remove is unsupported");
} catch (UnsupportedOperationException ex) {
// expected
}
int idx = 0;
int actualLines = 0;
while (iterator.hasNext()) {
String line = (String) iterator.next();
actualLines++;
assertEquals("Comparing line " + idx, lines.get(idx), line);
assertTrue("Exceeded expected idx=" + idx + " size=" + lines.size(), idx < lines.size());
idx++;
if (idx % 3 == 1) {
idx++;
}
}
assertEquals("Line Count doesn't match", 9, lines.size());
assertEquals("Line Count doesn't match", 9, idx);
assertEquals("Line Count doesn't match", 6, actualLines);
// try calling next() after file processed
try {
iterator.next();
fail("Expected NoSuchElementException");
} catch (NoSuchElementException expected) {
// ignore, expected result
}
try {
iterator.nextLine();
fail("Expected NoSuchElementException");
} catch (NoSuchElementException expected) {
// ignore, expected result
}
} finally {
LineIterator.closeQuietly(iterator);
}
}
}